<?php

namespace PhpYes\Entity;

abstract class EntityCacheBase
{

    /**
     * 从缓存取数据
     * 对于只支持键值对的缓存, 可以将 ($db, $table, $uniKey, $uniKeyVal) 拼接成缓存键, 例如: $cacheKey = "dbdata:{$db}:{$table}:{$uniKey}:{$uniKeyVal}";
     * @param string $db - 数据库名
     * @param string $table - 表名
     * @param string $uniKey - 表中的唯一索引名, 例如: id, phone(phone是唯一索引的话), admin-menu((admin_id, menu_id)是唯一索引的话)
     * @param string $uniKeyVal - 指定的 $uniKey 对应的值, 例如: 10(id), 15623967785(phone), 10-1(admin-menu)
     * @return string
     */
    abstract public function get($db, $table, $uniKey, $uniKeyVal);

    /**
     * 从缓存取数据
     * 参数请参见 self::get 中的同名参数
     * @param string $db
     * @param string $table
     * @param int $id - 主键id
     * @return string
     */
    public function getById($db, $table, $id)
    {
        return $this->get($db, $table, 'id', $id);
    }

    /**
     * 把数据存入缓存
     * 参数请参见 self::get 中的同名参数
     * @param string $db
     * @param string $table
     * @param string $uniKey
     * @param string $uniKeyVal
     * @param int $ttl - seconds, time to live
     * @param string $val - 要存入缓存的数据
     * @return bool
     */
    abstract public function set($db, $table, $uniKey, $uniKeyVal, $ttl, $val);

    /**
     * 把数据存入缓存
     * 参数请参见 self::set 中的同名参数
     * @param string $db
     * @param string $table
     * @param int $id - 主键id
     * @param int $ttl
     * @param string $val
     * @return bool
     */
    public function setById($db, $table, $id, $ttl, $val)
    {
        return $this->set($db, $table, 'id', $id, $ttl, $val);
    }

    /**
     * 删除缓存中的数据
     * 要求:
     * 1. $uniKey = '*' : 不关注 $uniKeyVal, 删除 [$db][$table] 下的所有缓存数据
     * 2. $uniKeyVal = empty : 不删除任何数据, 直接返回 0
     * 3. $uniKeyVal = '*' : 删除 [$db][$table][$uniKey] 下的所有缓存数据
     * 4. $uniKeyVal = 有效string : 删除 [$db][$table][$uniKey][$uniKeyVal] 中的缓存数据
     * 5. $uniKeyVal = [有效string, ...] : 删除 [$db][$table][$uniKey][有效string, ...] 中的缓存数据
     * 6. $uniKeyVal = [有效string, ...] : 当数组数量太大时, 实现会将其切成一段段的进行删除, 所以不用担心传入的数组数量太大导致处理太慢。
     *
     * 对于只支持键值对的缓存, 可以将 ($db, $table, $uniKey, $uniKeyVal) 拼接成缓存键, 例如: $cacheKey = "dbdata:{$db}:{$table}:{$uniKey}:{$uniKeyVal}";
     * 而且要设法达成以上要求, 当选用的缓存无法达成以上要求时, 就要考虑换缓存了
     *
     * @param string $db - 数据库名
     * @param string $table - 表名
     * @param string $uniKey - * 或者 表中的唯一索引名, 例如: id, phone(phone是唯一索引的话), admin-menu((admin_id, menu_id)是唯一索引的话)
     * @param string|string[] $uniKeyVal - * 或者 指定的 $uniKey 对应的值 或者 值的数组, 例如: id: 10, [10,11,12], phone: 15623967785, [15623967785,15623967786], admin-menu: 10-1, [10-1,10-2,11-1]
     * @return int - Number of keys deleted.
     */
    abstract public function del($db, $table, $uniKey, $uniKeyVal = '');

    /**
     * 删除缓存中的数据
     * 参数请参见 self::del 中的同名参数
     *
     * 1. $id = empty : 不删除任何数据, 直接返回 0
     * 2. $id = '*' : 删除 [$db][$table]['id'] 下的所有缓存数据
     * 3. $id = 有效string : 删除 [$db][$table]['id'][$id] 中的缓存数据
     * 4. $id = [有效string, ...] : 删除 [$db][$table]['id'][有效string, ...] 中的缓存数据
     * 5. $id = [有效string, ...] : 当数组数量太大时, 实现会将其切成一段段的进行删除, 所以不用担心传入的数组数量太大导致处理太慢。
     *
     * @param string $db
     * @param string $table
     * @param string|string[] $id
     * @return int
     */
    public function delById($db, $table, $id)
    {
        return $this->del($db, $table, 'id', $id);
    }

}